#pragma once


#ifndef __CANVAS_PAIR_H
#define __CANVAS_PAIR_H

#include "..\Objects.h"

namespace Canvas
{
	namespace Collection
	{
		template<class K, class V>
		struct Pair
		{
		public:
			K key;
			V value;
			Pair() {}
			Pair(const K& k, const V& v) : key(k), value(v) {}
			Pair(const Pair<K, V>& pair) : key(pair.key), value(pair.value) {}
			
			int CompareTo(const Pair<K, V>& pair) const
			{
				if (key<pair.key)
				{
					return -1;
				}
				else if (key>pair.key)
				{
					return 1;
				}
				else if (value<pair.value)
				{
					return -1;
				}
				else if (value>pair.value)
				{
					return 1;
				}
				else
				{
					return 0;
				}
			}

			bool operator==(const Pair<K, V>& t) const { return CompareTo(t) == 0; }
			bool operator!=(const Pair<K, V>& t) const { return CompareTo(t) != 0; }
			bool operator< (const Pair<K, V>& t) const { return CompareTo(t) < 0; }
			bool operator<=(const Pair<K, V>& t) const { return CompareTo(t) <= 0; }
			bool operator> (const Pair<K, V>& t) const { return CompareTo(t) > 0; }
			bool operator>=(const Pair<K, V>& t) const { return CompareTo(t) >= 0; }
		};

		template<class K, class V>
		Pair<K, V> MakePair(const K& key, const V& value)
		{
			return Pair<K, V>(key, value);
		}
		
		template<typename K, typename V>
		struct POD<Pair<K, V>>
		{
			static const bool Result = POD<K>::Result && POD<V>::Result;
		};

	}
}

#endif